package co.edu.javeriana.touresbalon.oms.services;

import co.edu.javeriana.touresbalon.b2c.entities.Espectaculo;
import co.edu.javeriana.touresbalon.b2c.entities.Producto;
import co.edu.javeriana.touresbalon.oms.webservices.clients.cacheb2c.CacheB2CClient;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author ada
 */
@Stateless
public class EspectaculosBeanService implements EspectaculosBeanServiceLocal {
    
    private static final String QUERY_UPDATE_SHOW_FROM_PROCESS="update ESPECTACULO set CAPACIDAD=CAPACIDAD-?, VENDIDOS=VENDIDOS+? where ID_ESPECTACULO=?";
    private static final String OBTAIN_LAST_ID="select MAX(ID_PRODUCTO) from PRODUCTO";    
    
    @PersistenceContext(unitName="TouresBalon_B2C-ejbPU")
    EntityManager manager;
    
    @Override
    public void actualizarEspectaculoDesdeProceso(int idEspectaculo, int numeroViajeros){
        Query query=manager.createNativeQuery(QUERY_UPDATE_SHOW_FROM_PROCESS);
        query.setParameter(1, numeroViajeros);
        query.setParameter(2, numeroViajeros);
        query.setParameter(3, idEspectaculo);        
        query.executeUpdate();
    }
    
    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void ingresarProducto(Producto product){
        manager.persist(product);
        manager.flush();
    }
    
    @Override
    public Integer obtenerIdUltimoProductoIngresado(){
        Query query=manager.createNativeQuery(OBTAIN_LAST_ID);  
        try{
            Integer id=(Integer) query.getSingleResult();
            return id;
        }catch(NoResultException e){
            return -1;
        }
    }
    @Override
    public Producto consultarProducto(Integer idProducto){
        return manager.find(Producto.class, idProducto);
    }
    
    public void actualizarCacheB2C(){
        CacheB2CClient cacheB2CClient=new CacheB2CClient();
        Query query=manager.createNamedQuery("Espectaculo.findAllIds");
        List<Integer> showIds=query.getResultList();
        if(showIds!=null && !showIds.isEmpty())
        {
            try {
                cacheB2CClient.clearCacheB2C();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            List<Espectaculo> shows=new ArrayList<Espectaculo>();
            Integer id=0;
            int i=0;
            for (;i<showIds.size();i++) {
                id=showIds.get(i);
                Espectaculo show=manager.find(Espectaculo.class, id);
                shows.add(show);
                if(i%100==0){
                    try {
                        cacheB2CClient.loadCacheB2C(shows);
                    } catch (Exception ex2) {
                        ex2.printStackTrace();
                    }
                    shows.clear();
                }
            }
            //por si al terminar no se alcanzó a enviar algún paquete es decir, que su tamaño no sea múltiplo de 100
            if (i % 100 != 0) {
                cacheB2CClient.loadCacheB2C(shows);                
            }
        }
    }
}
